package com.wish.wishsystem_management.task;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import com.wish.wishsystem_management.config.EsUtils;
import com.wish.wishsystem_management.entity.ESSaveRoomParam;
import com.wish.wishsystem_management.service.IEsSyncTimeService;
import com.wish.wishsystem_management.service.ITbRoomInfoService;
import lombok.extern.apachecommons.CommonsLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import vo.QueryRoomInfoResponseVo;


@Component
@EnableScheduling
@Configuration
@CommonsLog
public class Task {

	/**
	 * 日志对象
	 */
	protected Logger logger = LoggerFactory.getLogger(getClass());

	// 定时一
//	@Value("${task.saveDealPerDayTask.enabled}")
//	private boolean saveDealPerDayTaskEnabled;

	// 定时二
//	@Value("${task.remainBills.enabled}")
//	private boolean remainBillsTaskEnabled;

	// 定时三
//	@Value("${task.checkBillEight.enabled}")
//	private boolean checkBillEightTaskEnabled;

	// 定时四
//	@Value("${task.checkBillEleven.enabled}")
//	private boolean checkBillElevenTaskEnabled;

	// 定时五
//	@Value("${task.checkPayBatchWithdraw.enabled}")
//	private boolean checkPayBatchWithdrawTaskEnabled;

	// 定时六
//	@Value("${task.checkPayBatchWithdrawBack.enabled}")
//	private boolean checkPayBatchWithdrawBackTaskEnabled;

	// 定时七
//	@Value("${task.updateAllRoomInfo.enabled}")
	private boolean updateAllRoomInfo;

	// 定时八
//	@Value("${task.updateAllHouseInfo.enabled}")
//	private boolean updateAllHouseInfo;

	// 定时九
//	@Value("${task.updateAllPremisesInfo.enabled}")
//	private boolean updateAllPremisesInfo;

	// 定时十
//	@Value("${task.updateAllEs.enabled}")
//	private boolean updateAllEs;

	// 定时十一
//	@Value("${task.updateAllFkBusinessCredit.enabled}")
//	private boolean updateAllFkBusinessCredit;

	@Autowired
	ElasticsearchTemplate elasticsearchTemplate;

	/**
	 * 房源service
	 */
	@Autowired
	private ITbRoomInfoService iTbRoomInfoService;

	/**
	 * es更新时间service
	 */
	@Autowired
	private IEsSyncTimeService iEsSyncTimeService;

	/**
	 * ************************ 定时任务一： ************************
	 * ①定时将商户前一天的线上线下的各项费用收入/支出汇总到t_cw_deal_per_day表
	 * （解约结算按结算明细拆分成保存到各个具体的款项中）
	 *
	 * ②定时统计维数公寓前一天的收入信息（支出信息暂时没有）各项费用收入汇总到t_cw_hailian_deal_per_day表
	 * （解约结算按整体归为其他款项）
	 */

	/**
	 * ************************ 定时任务二： ************************
	 * 收款定时短信提醒(每天下午一点检查)
	 */

	/**
	 * ************************ 定时任务三： ************************
	 * 每天上午8点半进行财务实时代付（批量代付不用对账）和快捷的对账
	 */

	/**
	 * ************************ 定时任务四： ************************
	 * 每天上午11点进行财务微信和支付宝的对账
	 */



	/**
	 * ************************ 定时任务五： ************************
	 * 每隔10分钟读取一次批量代付的付款状态(普通回盘文件读取)
	 */


	/**
	 * ************************ 定时任务六： ************************
	 * 每天18点读取批量代付的退票回盘文件
	 */


	/**
	 * ************************ 定时任务七： ************************
	 * 每隔5分钟room_info更新处理
	 */
	@Scheduled(cron = "0 0/5 3-23 * * ?")
	public void updateAllRoomInfo() {

		if (!updateAllRoomInfo) {
			return;
		}

		logger.info("-------定时器-----start updateAllRoomInfo ...");

		String tbRoomInfo = "tb_room_info";

		Date oldDate = iEsSyncTimeService.selectTime(tbRoomInfo);
		Date newDate = new Date();

		HashMap<String,Object> map = new HashMap<>();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		map.put("tableName", tbRoomInfo);
		map.put("newDate", dateFormat.format(newDate));
		iEsSyncTimeService.updateEsSyncTimeByTableName(map);

		//去房源表中取时间段中发生变化的数据
		map.put("oldDate", dateFormat.format(oldDate));
		//status为1时为查询房源信息
		map.put("status", 1);
		List<QueryRoomInfoResponseVo> queryRoomInfoList = iTbRoomInfoService.queryRoomInfoList(map);

		//判断有没有变化的数据
		if(queryRoomInfoList == null || queryRoomInfoList.size() == 0) {
			return;
		}

		String ids = "";
		List<ESSaveRoomParam> param = new ArrayList<>();

		//判断房源状态，只有为待租中才同步es及未删除状态
		for (int i = queryRoomInfoList.size()-1; i >= 0;i--) {
			if(queryRoomInfoList.get(i).getStatus() != 0 || queryRoomInfoList.get(i).getDelFlg() == 1 || queryRoomInfoList.get(i).getPublishStatus() == 0 || queryRoomInfoList.get(i).getHStatus() == 1) {
				ids += "," + queryRoomInfoList.get(i).getRoomId();
				queryRoomInfoList.remove(i);
			}else {
				ESSaveRoomParam esSaveRoomParam = new ESSaveRoomParam();
				BeanUtils.copyProperties(queryRoomInfoList.get(i), esSaveRoomParam);
				//把没问题的数据存入集合
				param.add(esSaveRoomParam);
			}
		}

		//判断有没有不符合条件数据
		if(param == null || param.size() == 0) {
			return;
		}

		try {
			//2.构建批量插入
//                List<IndexQuery> queries = new ArrayList<>();
//                //上面的那几步也可以使用IndexQueryBuilder来构建
			for (ESSaveRoomParam roomParam: param) {
				EsUtils.save(elasticsearchTemplate,roomParam,roomParam.getRoomId());
			}
			logger.info("------定时器-----updateAllRoomInfo 中 insertOrUpdateBulk 添加房源成功  ----共{}条------",param.size());
		} catch (Exception e) {
			e.printStackTrace();
			logger.info("------定时器-----updateAllRoomInfo 中 insertOrUpdateBulk 异常-------");
		}

		logger.info("-----定时器----- end updateAllRoomInfo...");
	}


	/**
	 * ************************ 定时任务八： ************************
	 * 每隔6分钟house_info更新处理
	 */


	/**
	 * ************************ 定时任务九： ************************
	 * 每隔1小时premises_info更新处理
	 */



	/**
	 * ************************ 定时任务十： ************************
	 * 每天凌晨2点进行es全量房源同步
	 */
	@Scheduled(cron = "0 30 1 * * ?")
	public void updateAllEs() {
//		if (!updateAllEs) {
//			return;
//		}
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date newDate = new Date();
		logger.info("-------定时器-----start updateAllEs ... -----------{}",dateFormat.format(newDate));
		this.iTbRoomInfoService.updateRoomInfoAllEs();
		Date date = new Date();
		logger.info("-------定时器-----end updateAllEs ... ------------{}",dateFormat.format(date));
	}

	/**
	 * ************************ 定时任务十一： ************************
	 * 每月一号00:00将风控管理中的月已用授信额度清空
	 */




}
